package ch01
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.text.TextField;
	import flash.utils.setTimeout;

	import tools.Star;

	/**
	 * 检测不规则图形之间的碰撞(五角星)
	 * @author sjp
	 *
	 */
	public class BitmapCollision3 extends Sprite
	{
		private var bmpd1:BitmapData;
		private var bmpd2:BitmapData;
		private var star1:Star;
		private var star2:Star;

		public function BitmapCollision3()
		{
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;
			// make two stars, add to stage
			star1 = new Star(50);
			addChild(star1);
			star2 = new Star(50);
			star2.x = 200;
			star2.y = 200;
			addChild(star2);

			var tf:TextField = new TextField();
			tf.text = "132";
			addChild(tf);
			trace(tf.width, tf.height);
			setTimeout(callLaterHandler, 500);

		}

		/**
		 * 该函数需要延时处理，否则在IE6下，stage.stageWidth和stage.stageHeight为0，BitmapData创建会出现异常
		 * */
		private function callLaterHandler(event:Event = null):void
		{
			// make two bitmaps, not on stage
			bmpd1 = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0);
			bmpd2 = bmpd1.clone();
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMoving);
		}

		/**
		 * 在构造函数内创建了两个BitmapData对象和两个星星，两个BitmapData对象没有放入Bitmap中，也就是没有加入到显示列表里， 而是直接加入了两个星星。
		 * 名为star1的星星跟随鼠标移动。每当鼠标移动时，两个位图都用fillRect清空。结果就是两张完全透明的位图，然后分别 绘上对应的星星：
		 * bmpd1.draw(star1, new Matrix(1,0,0,1, star1.x,star1.y)); bmpd2.draw(star2, new Matrix(1,0,0,1, star2.x,star2.y));
		 * 绘制时采用了星星的位置作为矩阵(matrix)的偏移量。现在测试：
		 * if(bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255))
		 * 因为BitmapData不在显示列表里，甚至都没在Bitmap中，加上两个星星又是同一坐标系，且被绘制在各自的相对位置上，所以不用去考虑任何坐标关系。只需传入默认情况下x和y都为0的Point即可。而透明阈值为255意味着两个星星不透明。
		 * */
		private function onMouseMoving(event:MouseEvent):void
		{
			// move star1 to the mouse position
			star1.x = mouseX;
			star1.y = mouseY;
			// clear the bitmaps
			/**清空原有数据*/
			bmpd1.fillRect(bmpd1.rect, 0);
			bmpd2.fillRect(bmpd2.rect, 0);
			/**方式一:
			 * 星星绘制到各自的相对位置上，hitTest方法中直接使用(0,0)坐标去判断
			 * */
//			// draw one star to each bitmap
//			bmpd1.draw(star1, new Matrix(1, 0, 0, 1, star1.x,star1.y));
//			bmpd2.draw(star2, new Matrix(1, 0, 0, 1, star2.x,star2.y));
//			// the hit test itself.
//			if (bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255))
//			{
//				star1.filters=[new GlowFilter()];
//				star2.filters=[new GlowFilter()];
//			}
//			else
//			{
//				star1.filters=[];
//				star2.filters=[];
//			}

			/**方式二:
			 * 星星全部绘制出 ，hitTest方法中使用各自的当前坐标去判断
			 * */
//			// draw one star to each bitmap
//			bmpd1.draw(star1, new Matrix(1, 0, 0, 1, star1.width / 2, star1.height / 2));
//			bmpd2.draw(star2, new Matrix(1, 0, 0, 1, star2.width / 2, star2.height / 2));
//			// the hit test itself.
//			if (bmpd1.hitTest(new Point(star1.x, star1.y), 255, bmpd2, new Point(star2.x, star2.y), 255))
//			{
//				star1.filters=[new GlowFilter()];
//				star2.filters=[new GlowFilter()];
//			}
//			else
//			{
//				star1.filters=[];
//				star2.filters=[];
//			}

			/**方式三:
			 * 星星绘制到各自的相对位置上，hitTest方法中直接使用(0,0)坐标去判断。这种方法最好，如果先前对星星进行旋转的话，该方法不会出错。
			 * */
			// draw one star to each bitmap
			bmpd1.draw(star1, star1.transform.matrix);
			bmpd2.draw(star2, star2.transform.matrix);
			// the hit test itself.
			if (bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255))
			{
				star1.filters = [new GlowFilter()];
				star2.filters = [new GlowFilter()];
			}
			else
			{
				star1.filters = [];
				star2.filters = [];
			}
		}
	}
}